#ifndef NETLIB_EVENTLOOPTHREAD_H
#define NETLIB_EVENTLOOPTHREAD_H

// IO线程类

#include "Condition.h"
#include "Mutex.h"
#include "Thread.h"

namespace netlib
{

namespace net
{

class EventLoop;

class EventLoopThread : noncopyable // 不可拷贝
{
public:
    typedef std::function<void(EventLoop*)> ThreadInitCallback;

    EventLoopThread(const ThreadInitCallback& cb = ThreadInitCallback(),
                    const string& name = string());

    ~EventLoopThread();

    EventLoop* startLoop(); // 启动线程，该线程成为了IO线程

private:
    void threadFunc();                      // 线程函数

    EventLoop* loop_ GUARDED_BY(mutex_);    // 一个EventLoop对象
    bool exiting_;                          // 是否退出
    Thread thread_;                         // 一个线程
    MutexLock mutex_;                       // 互斥锁
    Condition cond_ GUARDED_BY(mutex_);     // 条件变量
    ThreadInitCallback callback_;           // 回调函数在EventLoop::loop事件循环之前被调用

}; // class EventLoopThread end

} // namespace net end

} // namespace netlib end

#endif